package com.project.nimsen.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;

public class ZipUtilsTool {

	/**
	 * 解压zip文件
	 * 
	 * @param zipFilePath
	 *            zip文件绝对路径
	 * @param unzipDirectory
	 *            解压到的目录
	 * @throws Exception
	 */
	public static String unzip(File file, String unzipDirectory)
			throws Exception {
		// 定义输入输出流对象
		InputStream input = null;
		OutputStream output = null;
		// 创建zip文件对象
		ZipFile zipFile = new ZipFile(file,"GBK");
		// 创建本zip文件解压目录
		String name = file.getName().substring(0, file.getName().lastIndexOf("."));
		File unzipFile = new File(unzipDirectory + File.separator + name);
		if (unzipFile.exists())
			unzipFile.delete();
		unzipFile.mkdir();
		// 得到zip文件条目枚举对象
		Enumeration zipEnum = zipFile.getEntries();
		// 定义对象
		ZipEntry entry = null;
		String entryName = null, path = null;
		String names[] = null;
		int length;
		// 循环读取条目
		while (zipEnum.hasMoreElements()) {
			// 得到当前条目
			entry = (ZipEntry) zipEnum.nextElement();
			entryName = new String(entry.getName());
			// 用/分隔条目名称
			names = entryName.split("\\/");
			length = names.length;
			path = unzipFile.getAbsolutePath();
			for (int v = 0; v < length; v++) {
				// 最后一个目录之前的目录
				if (v < length - 1) {
					File filedir = new File(path += File.separator + names[v] + File.separator);
					filedir.mkdirs();
				}else { // 最后一个
					// 为目录,则创建文件夹
					if (entryName.endsWith("/")) {
						File filedir = new File(unzipFile
								.getAbsolutePath() + File.separator + entryName);
						filedir.mkdirs();
					}
					else { // 为文件,则输出到文件
						input = zipFile.getInputStream(entry);
						output = new FileOutputStream(new File(
								unzipFile.getAbsolutePath() + File.separator
										+ entryName));
						byte[] buffer = new byte[1024 * 8];
						int readLen = 0;
						while ((readLen = input.read(buffer, 0, 1024 * 8)) != -1)
							output.write(buffer, 0, readLen);
						// 关闭流
						if (input != null)
							input.close();
						if (output != null) {
							output.flush();
							output.close();
						}
					}
				}
			}
		}
		zipFile.close();
		return name;
	}
}
